<?php

declare (strict_types=1);

namespace magein\pay;

use magein\pay\data\NoticeData;
use magein\pay\data\PayOrderData;
use magein\utils\Result;

abstract class PayPlatform
{
    /**
     * 平台标记名称
     * @return string
     */
    abstract public static function getPlatformName(): string;

    /**
     * 匹配配置文件
     * @param $data
     * @return array
     */
    abstract public function matchConfig($data): array;

    /**
     * 统一下单
     * @param PayOrderData $pay_order_data
     * @return Result
     */
    abstract public function unify(PayOrderData $pay_order_data): Result;

    /**
     * 根据支付订单编号从第三方支付平台查询订单支付结果
     * @param $pay_no
     * @return mixed
     */
    abstract public function queryByPayNo($pay_no);

    /**
     * 规范各个平台的异步通知参数，转化为NotifyData
     * @param $data
     * @return NoticeData
     */
    abstract public function notifyData($data): NoticeData;

    /**
     * 异步通知业务处理
     * @param $data
     * @return NoticeData
     */
    abstract public function handleNotify($data): NoticeData;


    /**
     * 设置http请求参数
     * @return void
     */
    public function init()
    {

    }

    public function doInit($data)
    {
        $config = $this->matchConfig($data);

        return $this->init($config);
    }

    /**
     * 获取异步通知地址
     * @param $pay_no
     * @return string
     */
    public function getNotifyUrl($pay_no): string
    {
        $domain = PayConfig::domain();

        return sprintf('%s/pay/notify/%s', $domain, $pay_no);
    }

    /**
     * @param $pay_no
     * @return string
     */
    public function getSuccessUrl($pay_no): string
    {
        $domain = PayConfig::domain();

        return sprintf('%s/pay/success/%s', $domain, $pay_no);
    }

    public function getQuiteUrl($pay_no): string
    {
        $domain = PayConfig::domain();

        return sprintf('%s/pay/quite/%s', $domain, $pay_no);
    }
}